package br.com.petshop.dao;

import br.com.petshop.entidades.Animal;
import br.com.petshop.entidades.AnimalType;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.LinkedList;
import java.util.List;

/**
 *
 * @author Sidney
 * @version 1.0
 * @see GenericDAO
 * Esta classe contem os metodos basicos para manipulacao do banco de dados, extende a classe GenericDAO e tem
 * como proposito manipular a tabela animal no banco de dados.Para pegar oatributo que corresponde ao ID_Cliente,
 * que e o dono do animal, no metodo populateAnimal() e criada uma instancia do ClienteDAO.
 */
public class AnimalDAO extends GenericDAO {

    public int adicionarAnimal(Animal animal) throws SQLException {
        /**
         * pega o proximo id da tabela animal, isso permite que ao adicionar um produto seja verificado 
         * se o id ja existe.Faz com que nao seja adicionado um elemento em uma posicao ocupada.
         */
        animal.setId(getNextId("animal"));
        String query = "INSERT INTO  petshop.animal (Id,ID_Cliente,Nome,Tipo,Raca,Idade)VALUES(?,?,?,?,?,?)";
        executeCommand(query, animal.getId(), animal.getIdCliente().getId(), animal.getNome(), animal.getTipo().toString(), animal.getRaca(), animal.getIdade());
        return animal.getId();
    }

    public void removerAnimal(int idAnimal) throws SQLException {
        executeCommand("DELETE FROM petshop.animal WHERE Id = ?", idAnimal);
    }

    public void atualizarAnimal(Animal animal) throws SQLException {
        String query = "UPDATE petshop.animal SET ID_Cliente  = ?, Nome = ?, Tipo = ?, Raca = ?, Idade = ? WHERE Id = ?";
        executeCommand(query, animal.getIdCliente().getId(), animal.getNome(), animal.getTipo().toString(),
                animal.getRaca(), animal.getIdade(), animal.getId());
    }

    public Animal getAnimal(int idAnimal) throws SQLException {
        ResultSet rs = executeQuery("SELECT * FROM petshop.animal WHERE Id = ?", idAnimal);
        Animal animal = null;
        while(rs.next()) {
            animal = populateAnimal(rs);
        }
        rs.close();
        return animal;
    }
    
     public List<Animal> getTodosAnimais() throws SQLException {
        ResultSet rs = executeQuery("SELECT * FROM petshop.animal");
        List<Animal> anRetornado = new LinkedList<Animal>();
        while(rs.next()){
            anRetornado.add(populateAnimal(rs));
        }
        rs.close();
        return anRetornado;
    }

    public List<Animal> getAnimalByName(String nome) throws SQLException {
        List<Animal> anResult = new LinkedList<Animal>();
        ResultSet rs = executeQuery("SELECT * FROM petshop.animal WHERE Nome LIKE ? " ,nome +"%");
        while (rs.next()) {
            anResult.add(populateAnimal(rs));
        }
        return anResult;
    }

    public static Animal populateAnimal(ResultSet rs) throws SQLException {
        ClienteDAO cliDAO = new ClienteDAO();//crio o objeto para ter acesso ao atributo idCliente da classe
        //Animal
        Animal anRetornado = new Animal();
        anRetornado.setId(rs.getInt("Id"));
        /**
         * para recuperar o id do cliente dono do animal utilizo o DAO de Cliente, que tem acesso ao metodo
         * getCliente que tem como tipo a classe Cliente e como parametro do metodo o id do cliente.
         */
        anRetornado.setIdCliente(cliDAO.getCliente(rs.getInt("ID_Cliente")));
        anRetornado.setNome(rs.getString("Nome"));
        //a classe Animal usa um ENUM(AnimalTye), para recuperar seu valor e chamado o metodo valueOf() concatenado
        //com o metodo toString.
        anRetornado.setTipo(AnimalType.valueOf(rs.getString("Tipo")));
        anRetornado.setRaca(rs.getString("Raca"));
        anRetornado.setIdade(rs.getInt("Idade"));
        return anRetornado;

    }

   
}
